home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / haeberli / libgutil / shadow.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  3KB  |  147 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.  *     shadow -
  19.  *        Make it easy to select a halftone gray pattern for shadows.
  20.  *
  21.  *                Paul Haeberli - 1985
  22.  */
  23. #include "gl.h"
  24.  
  25. static unsigned short shadow[16] = {
  26.     0x5555, 0xaaaa, 0x5555, 0xaaaa, 
  27.     0x5555, 0xaaaa, 0x5555, 0xaaaa, 
  28.     0x5555, 0xaaaa, 0x5555, 0xaaaa, 
  29.     0x5555, 0xaaaa, 0x5555, 0xaaaa
  30. }; 
  31.  
  32. #define SHADOWPAT    1255
  33. #define DITHERPAT    1256
  34.  
  35. static int firsted;
  36.  
  37. shadowpattern()
  38. {
  39.     if(!firsted) {
  40.     defpattern(SHADOWPAT,16,shadow);
  41.     firsted++;
  42.     }
  43.     setpattern(SHADOWPAT);
  44. }
  45.  
  46.  
  47. fclear()
  48. {
  49.     nextdither();
  50.     clear();
  51.     setpattern(0);
  52. }
  53.  
  54. static int shifts[16] = {
  55.     0, 2, 2, 0,
  56.     1, 3, 3, 1,
  57.     0, 2, 2, 0,
  58.     1, 3, 3, 1,
  59. };
  60.  
  61. static int wheres[16] = {
  62.     0, 2, 0, 2,
  63.     1, 3, 1, 3,
  64.     1, 3, 1, 3,
  65.     0, 2, 0, 2,
  66. };
  67.  
  68. static int texno;
  69.  
  70. nextdither()
  71. {
  72.     setdither(texno++);
  73. }
  74.  
  75. setdither(n)
  76. int n;
  77. {
  78.     unsigned short tex[16];
  79.  
  80.     ditherpat(n,tex);
  81.     defpattern(DITHERPAT,16,tex);    
  82.     setpattern(DITHERPAT);
  83. }
  84.  
  85. ditherpat(n,tex)
  86. int n;
  87. unsigned short tex[16];
  88. {
  89.     int i;
  90.     int shift, where, pattern;
  91.  
  92.     n = n&0xf;
  93.     for(i=0; i<16; i++)
  94.     tex[i] = 0;
  95.     shift = shifts[n];     
  96.     where = wheres[n];     
  97.     pattern = 0x1111<<shift;
  98.     tex[where+0] = pattern;
  99.     tex[where+4] = pattern;
  100.     tex[where+8] = pattern;
  101.     tex[where+12] = pattern;
  102. }
  103.  
  104. float frand();
  105. static float thresh[16][16];
  106. static unsigned short tex[16];
  107.  
  108. static short dithmat[4][4] = {
  109.     0, 8, 2, 10,
  110.     12, 4, 14, 6,
  111.     3, 11, 1, 9,
  112.     15, 7, 13, 5,
  113. };
  114.  
  115. alphapat(alpha)
  116. float alpha;
  117. {
  118.     unsigned short val, bit;
  119.     float min, max;
  120.     int x, y;
  121.     static int firsted;
  122.  
  123.     if(alpha >0.99) {
  124.     setpattern(0);
  125.     return;
  126.     }
  127.     if(!firsted) {
  128.         for(y=0; y<16; y++)
  129.             for(x=0; x<16; x++) 
  130.         thresh[y][x] = (dithmat[y%4][x%4]+frand())/16.0;
  131.     firsted = 1;
  132.     }
  133.     max = alpha;
  134.     for(y=0; y<16; y++) {
  135.     val = 0;
  136.     bit = 1;
  137.     for(x=0; x<16; x++) {
  138.         if(thresh[y][x]<max) 
  139.         val |= bit;
  140.         bit <<= 1;
  141.     }
  142.     tex[y] = val;
  143.     }
  144.     defpattern(23,16,tex);
  145.     setpattern(23);
  146. }
  147.